`default_nettype none

module gen_dreg_m #(
    parameter [0:0] BEFORE_EDGE_CP_I = 0,
    parameter [31:0] WIDTH_CP_I = 1,
    parameter [WIDTH_CP_I-1:0] INIT_VALUE_CP_I = 0
) (
    input rst_w_ni,
    input clk_w_i,
    input set_en_w_pi,
    input [WIDTH_CP_I-1:0] set_wp_i,

    output [WIDTH_CP_I-1:0] get_wp_o
);
    reg  [WIDTH_CP_I-1:0] value_rp_l;
    wire [WIDTH_CP_I-1:0] new_value_if_not_rst_wp_l = set_en_w_pi ? set_wp_i : value_rp_l;

    generate
        if (BEFORE_EDGE_CP_I == 0) begin : gen_posedge_reg
            always @(posedge clk_w_i or negedge rst_w_ni) begin
                if (rst_w_ni == 0) begin
                    value_rp_l <= INIT_VALUE_CP_I;
                end else begin
                    value_rp_l <= new_value_if_not_rst_wp_l;
                end
            end
        end else begin : gen_negedge_reg
            always @(negedge clk_w_i or negedge rst_w_ni) begin
                if (rst_w_ni == 0) begin
                    value_rp_l <= INIT_VALUE_CP_I;
                end else begin
                    value_rp_l <= new_value_if_not_rst_wp_l;
                end
            end
        end
    endgenerate

    assign get_wp_o = value_rp_l;
endmodule
